import time
import random
from datetime import datetime

class Plugin(JCbotPlugin):
    """示例插件 - 展示插件的各种功能"""
    
    def __init__(self, bot_instance):
        super().__init__(bot_instance)
        self.plugin_name = "示例插件"
        self.version = "1.0.0"
        self.description = "这是一个功能完整的示例插件，演示插件的各种功能"
        
        # 插件内部状态
        self.command_count = 0
        self.last_command_time = 0
        self.user_stats = {}  # 用户使用统计
        
        # 插件配置
        self.config = {
            "max_daily_commands": 50,  # 每日最大命令次数
            "cooldown_seconds": 10,    # 命令冷却时间
            "enable_fun_commands": True,
            "custom_message": "这是一个自定义消息"
        }
        
    def get_handlers(self):
        """返回插件提供的所有命令处理器"""
        return {
            "example_hello": self.handle_hello,
            "example_stats": self.handle_stats,
            "example_quote": self.handle_quote,
            "example_config": self.handle_config,
            "example_admin": self.handle_admin_command
        }
        
    def get_commands_config(self):
        """返回插件要注册的命令配置"""
        return {
            "示例问候": {
                "description": "简单的问候命令",
                "handler": "example_hello",
                "permission": 1,
                "fuzzy_match": False,
                "group": "示例插件"
            },
            "插件统计": {
                "description": "查看插件使用统计",
                "handler": "example_stats",
                "permission": 1,
                "fuzzy_match": False,
                "group": "示例插件"
            },
            "随机名言": {
                "description": "获取随机名言",
                "handler": "example_quote",
                "permission": 1,
                "fuzzy_match": False,
                "group": "示例插件"
            },
            "插件配置": {
                "description": "查看或修改插件配置（管理员专用）",
                "handler": "example_config",
                "permission": 2,  # 需要管理员权限
                "fuzzy_match": False,
                "group": "示例插件"
            },
            "插件管理": {
                "description": "插件管理命令（超级管理员专用）",
                "handler": "example_admin",
                "permission": 3,  # 需要超级管理员权限
                "fuzzy_match": False,
                "group": "示例插件"
            }
        }
        
    def register(self):
        """插件注册时调用"""
        self.bot.logger.info(f"✅ 示例插件 v{self.version} 注册成功！")
        self.bot.logger.info(f"📝 插件描述: {self.description}")
        
        # 加载插件配置（如果有）
        self.load_config()
        
    def load_config(self):
        """加载插件配置"""
        try:
            # 尝试从文件加载配置
            config_path = os.path.join(self.bot.config_dir, "plugins", "example_plugin_config.json")
            if os.path.exists(config_path):
                with open(config_path, 'r', encoding='utf-8') as f:
                    saved_config = json.load(f)
                    # 合并配置，保留默认值
                    for key, value in saved_config.items():
                        if key in self.config:
                            self.config[key] = value
                self.bot.logger.info("✅ 示例插件配置加载成功")
        except Exception as e:
            self.bot.logger.error(f"❌ 加载示例插件配置失败: {e}")
            
    def save_config(self):
        """保存插件配置"""
        try:
            config_path = os.path.join(self.bot.config_dir, "plugins", "example_plugin_config.json")
            os.makedirs(os.path.dirname(config_path), exist_ok=True)
            with open(config_path, 'w', encoding='utf-8') as f:
                json.dump(self.config, f, indent=4, ensure_ascii=False)
        except Exception as e:
            self.bot.logger.error(f"❌ 保存示例插件配置失败: {e}")
            
    def update_user_stats(self, user_id: int):
        """更新用户统计"""
        today = datetime.now().strftime("%Y-%m-%d")
        if user_id not in self.user_stats:
            self.user_stats[user_id] = {}
        if today not in self.user_stats[user_id]:
            self.user_stats[user_id][today] = 0
        self.user_stats[user_id][today] += 1
        
    def check_cooldown(self, user_id: int) -> bool:
        """检查命令冷却时间"""
        current_time = time.time()
        if current_time - self.last_command_time < self.config["cooldown_seconds"]:
            return False
        self.last_command_time = current_time
        return True
        
    def check_daily_limit(self, user_id: int) -> bool:
        """检查每日使用限制"""
        today = datetime.now().strftime("%Y-%m-%d")
        user_daily_count = self.user_stats.get(user_id, {}).get(today, 0)
        return user_daily_count < self.config["max_daily_commands"]
    
    # ========== 命令处理器 ==========
    
    async def handle_hello(self, group_id: int, user_id: int, command: str, param: str, options: Dict = None) -> str:
        """处理问候命令"""
        self.command_count += 1
        self.update_user_stats(user_id)
        
        # 检查冷却时间
        if not self.check_cooldown(user_id):
            return "命令冷却中，请稍后再试！"
            
        # 检查每日限制
        if not self.check_daily_limit(user_id):
            return f"今日命令次数已达上限 ({self.config['max_daily_commands']}次)"
        
        # 获取用户名
        user_name = await self.get_user_name(group_id, user_id)
        
        responses = [
            f"你好，{user_name}！👋",
            f"欢迎使用示例插件，{user_name}！🎉",
            f"{user_name}，很高兴为你服务！✨",
            f"你好 {user_name}，这是示例插件的问候！🌟"
        ]
        
        return random.choice(responses)
        
    async def handle_stats(self, group_id: int, user_id: int, command: str, param: str, options: Dict = None) -> str:
        """处理统计命令"""
        self.command_count += 1
        self.update_user_stats(user_id)
        
        today = datetime.now().strftime("%Y-%m-%d")
        user_daily_count = self.user_stats.get(user_id, {}).get(today, 0)
        
        stats_message = f"📊 示例插件统计信息：\n"
        stats_message += f"• 总命令次数: {self.command_count}\n"
        stats_message += f"• 今日使用次数: {user_daily_count}/{self.config['max_daily_commands']}\n"
        stats_message += f"• 插件版本: v{self.version}\n"
        stats_message += f"• 最后活跃: {datetime.now().strftime('%H:%M:%S')}"
        
        return stats_message
        
    async def handle_quote(self, group_id: int, user_id: int, command: str, param: str, options: Dict = None) -> str:
        """处理随机名言命令"""
        self.command_count += 1
        self.update_user_stats(user_id)
        
        quotes = [
            "「知识就是力量。」 — 弗朗西斯·培根",
            "「行动胜于空谈。」 — 谚语",
            "「千里之行，始于足下。」 — 老子",
            "「生活就像一盒巧克力，你永远不知道下一颗是什么味道。」 — 《阿甘正传》",
            "「成功不是终点，失败也不是终结，唯有勇气才是永恒。」 — 温斯顿·丘吉尔",
            "「编程不是关于打字，而是关于思考。」 — 未知",
            "「最简单的解决方案往往是最好的。」 — 奥卡姆剃刀原理",
            "「代码就像幽默，当你必须解释它时，它就不那么好了。」 — 科里·豪斯"
        ]
        
        return f"💭 随机名言：\n{random.choice(quotes)}"
        
    async def handle_config(self, group_id: int, user_id: int, command: str, param: str, options: Dict = None) -> str:
        """处理配置命令"""
        self.command_count += 1
        
        # 检查用户权限
        user_permission = self.bot.get_user_permission(user_id)
        if user_permission < 2:  # 需要管理员权限
            return "❌ 权限不足，需要管理员权限"
            
        if not param:
            # 显示当前配置
            config_info = "⚙️ 示例插件当前配置：\n"
            for key, value in self.config.items():
                config_info += f"• {key}: {value}\n"
            config_info += "\n使用：插件配置 [键] [值] 来修改配置"
            return config_info
            
        # 解析参数
        parts = param.split()
        if len(parts) == 1:
            # 查看特定配置项
            key = parts[0]
            if key in self.config:
                return f"🔧 {key} = {self.config[key]}"
            else:
                return f"❌ 未知配置项: {key}"
                
        elif len(parts) >= 2:
            # 修改配置
            key = parts[0]
            new_value = parts[1]
            
            if key not in self.config:
                return f"❌ 未知配置项: {key}"
                
            # 类型转换
            old_value = self.config[key]
            try:
                if isinstance(old_value, bool):
                    if new_value.lower() in ['true', '1', 'yes', 'on']:
                        new_value = True
                    elif new_value.lower() in ['false', '0', 'no', 'off']:
                        new_value = False
                    else:
                        return f"❌ 布尔值应为 true/false"
                elif isinstance(old_value, int):
                    new_value = int(new_value)
                elif isinstance(old_value, float):
                    new_value = float(new_value)
                # 字符串不需要转换
                    
                self.config[key] = new_value
                self.save_config()
                return f"✅ 配置已更新：{key} = {old_value} → {new_value}"
            except ValueError:
                return f"❌ 值类型不匹配，期望类型: {type(old_value).__name__}"
                
        return "❌ 参数格式错误"
        
    async def handle_admin_command(self, group_id: int, user_id: int, command: str, param: str, options: Dict = None) -> str:
        """处理管理员命令"""
        self.command_count += 1
        
        # 检查用户权限
        user_permission = self.bot.get_user_permission(user_id)
        if user_permission < 3:  # 需要超级管理员权限
            return "❌ 权限不足，需要超级管理员权限"
            
        if param == "重置统计":
            self.command_count = 0
            self.user_stats = {}
            return "✅ 插件统计已重置"
            
        elif param == "重新加载":
            self.load_config()
            return "✅ 插件配置已重新加载"
            
        elif param == "状态":
            plugin_status = "🔌 示例插件状态：\n"
            plugin_status += f"• 运行中: ✅\n"
            plugin_status += f"• 版本: v{self.version}\n"
            plugin_status += f"• 命令总数: {self.command_count}\n"
            plugin_status += f"• 注册用户数: {len(self.user_stats)}\n"
            plugin_status += f"• 最后活动: {time.strftime('%Y-%m-%d %H:%M:%S')}"
            return plugin_status
            
        else:
            return "可用管理命令：\n• 重置统计\n• 重新加载\n• 状态"
            
    # ========== 辅助方法 ==========
    
    async def get_user_name(self, group_id: int, user_id: int) -> str:
        """获取用户名（使用主程序的API）"""
        try:
            # 调用主程序的API获取用户信息
            result = await self.bot.call_api("get_group_member_info", {
                "group_id": group_id,
                "user_id": user_id
            })
            
            if result and "data" in result:
                member_info = result["data"]
                return member_info.get("card") or member_info.get("nickname", f"用户{user_id}")
        except Exception as e:
            self.bot.logger.error(f"获取用户信息失败: {e}")
        
        return f"用户{user_id}"